<?php
/**
 * Inicialmente esta classe armazenará todas as configurações guardadas no arquivo core/config/[pasta_aplicativo]/config.xml
 * incluindo a lista de páginas válidas pelo sistema, url final, url temporárias nomes e demais configurações
 * Ela será inicializada pela classe CORE e repassada para todos os controles em tempo de execução
 * 
 * @author Cristiano M. Gomes <cmgomes.es@gmail.com>
 * @version 1.7
 */
class Sistema{
	/**
	 * Propriedade singleton do objeto
	 *
	 * @var unknown_type
	 */
	private static $Instancia;

	/**
	 * Retorna o objeto Config_Paginas com as lista de páginas listadas no config.xml da aplicação
	 *
	 * @var Config_Paginas
	 */
	private $paginas;
	
	/**
	 * Retorna o objeto Config_Site com informações do site no config.xml da aplicação
	 *
	 * @var Config_Site
	 */
	private $site;
	
	/**
	 * Retorna o objeto Config_Database com informações de banco de dados no config.xml da aplicação
	 *
	 * @var Config_Database
	 */
	private $database;

	/**
	 * Retorna nome da página atual que está sendo acessada
	 *
	 * @var string
	 */
	private $pagina;

	/**
	 * Método que retorna a página atual que está sendo acessada
	 *
	 * @return string
	 */
	public function GetPaginaAtual(){
		return $this->pagina;
	}

	/**
	 * Método de retorno do objeto Sessao do sistema
	 *
	 * @return Sessao
	 */
	public function GetSessao(){
		return Sessao::Instanciar();
	}
	
	/**
 	 * ControleBase Controle php a ser chamado
 	 * 
 	 * @var string
 	 * @access private
 	 */
 	private $ControleBase;
 	public function GetControleBase(){ return $this->ControleBase; }

 	/**
 	 * Parametros Lista de parâmetros enviadas pela requisição
 	 *
 	 * @var array
 	 */
 	private $Parametros;
 	
 	/**
 	 * Método de gerenciamento dos parametros
 	 *
 	 * @param string $param
 	 * @return variavel
 	 */
 	public function GetParametros($param = ''){ 
		if(!$param){
			return $this->Parametros; 
		}else{
			$parans  = $this->Parametros;
			if(isset($parans[$param])){
				return $parans[$param];
			}
			return false;
		}
	}

	/**
	 * Método construtor da classe, carrega o arquivo config.xml da aplicação e configura os objetos
	 * responsávels por armazenar cada tipo de informação
	 *
	 * @return void
	 */
    function  __construct(){
        $xml = DIR_CONFIG . 'config.xml';
        if(file_exists($xml))
        {
            $xml = simplexml_load_file($xml);

            $this->paginas = $xml->paginas;
            $this->site = $xml->site;
            $this->database = $xml->db;
        }

    }

	/**
	 * Esta função coleta os dados do arquivo log.xml de log do msn e apresenta os diálogos na tela.
	 */ 	
	public function ListaLog(){
		$log = DIR_CONFIG . 'log.xml';
		if(file_exists($log)){
			$xml = simplexml_load_file($log);

			for($i = 0; $i < sizeof($xml->Message); $i++){
				$atrib = $xml->Message[$i]->From->User->attributes();
				$nome = $atrib['FriendlyName'][0];
				echo "<b>" . $nome . ':</b> ';
				echo $xml->Message[$i]->Text;
				echo '<br />';
			}
		}else{
			echo "deu zica";die();
		}
	}

    /**
     * Retorna uma página específica passada por parâmetro ou array com todas as páginas
     *  
     * @param String $nome	nome da página a ser carregada
     * @return Pagina | Array de Paginas
     */
	public function Paginas($nome = ''){
		if($nome){
			foreach($this->paginas->item as $pag){
				if($pag->nome == $nome){
					$pagina = new config_Paginas($pag->nome, $pag->arquivo, $pag->controle, $pag->login, $pag->javascript);
				}
			}
			return $pagina;
		}else{
			$array = array();
			foreach($this->paginas->item as $pag){
				$pagina = new Config_Paginas($pag->nome, $pag->arquivo, $pag->controle, $pag->login, $pag->javascript);
				array_push($array, $pagina);
			}
			return $array;
		}
	}

	/**
	 * Método que fornece o objeto site com informações sobre o site armazenados no config.xml da aplicação
	 *
	 * @return Config_Site
	 */
	public function Site(){
		$sis = $this->site;
	    $Site = new Config_Site($sis->nome, $sis->url, $sis->tmp_url, $sis->db);
	    return $Site;
	}

	/**
	 * Método que fornece o objeto site com informações de database armazenados no config.xml da aplicação
	 *
	 * @return Config_Database
	 */
	public function Database(){
		$db = $this->database;

		$Database = new Config_Database($db->host, $db->base, $db->usuario, $db->senha, $db->porta, $db->dbtype);
		return $Database;
	}

	/**
	 * Verifica se a página requisitada consta no arquivo xml e existe nas pastas definidas
	 * 
	 * @return boolean
	 */
	public function ValidaPagina(){
		$paginas = $this->Paginas();
		$valida = false;
		$login = false;
		foreach($paginas as $item){
			if($item->Nome() == $this->GetControleBase()){
				$this->pagina = $item;
				$valida = true;
				if($item->Login() == 'true'){
					if(!$this->GetSessao()->GetVarSessao('logado')){
						header("location: ?page=login");
					}
				}
			}
		}
		return $valida;
	}

	/**
	 * Pega a Url completa digitada e trata, separando as requisições de Action e Page
	 * Se não houver parametro PAGE ele capitura o que foi digitado na URI e trata configurando
	 * o parametro PAGE manualmente. Já o parametro Action tem que ser setado senão sistema chama
	 * método padrão Mostratela() 
	 * 
	 * @return void  
	 */
	public function TrataUrl(){

		$this->Parametros = array_merge($_REQUEST, $_FILES);
		$Url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

		$TmpArray = $this->Parametros;
		if(isset($TmpArray['page'])){
			$paginas = $this->Paginas();
			foreach($paginas as $item){
				if($item->Nome() == $TmpArray['page']){
					$this->ControleBase = $item->Controle();
					//$this->pagina = $TmpArray['page'];
				}
			}
		}else{
			$site = '';
			$Url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

			$ar = explode('/', $Url);
			$query = array_pop($ar);
			$url_querystring = explode('?', $query);

			$this->pagina = ($url_querystring[0] == '') ? 'index' : $url_querystring[0];
			$this->Parametros['page'] = $this->pagina;
			
			$paginas = $this->Paginas();
			
			foreach($paginas as $item){
				if($item->Nome() == $this->pagina){
					$this->ControleBase = $item->Controle();
				}
			}
		}
	}

	/**
	 * Método que fornece o singleton do objeto
	 *
	 * @return unknown
	 */
	public static function GetInstancia(){
		if(!isset(self::$Instancia)){
			self::$Instancia = new Sistema();
		}
		return self::$Instancia;
	}

}